/*
 * Copyright 2001 Alexander Boverman and the original authors.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef _WT_TABLE_CMDS_H
#define _WT_TABLE_CMDS_H

#include <tcl.h>

typedef enum {
  WT_TBL_CMD_DONE,
  WT_TBL_CMD_MISSING,
  WT_TBL_CMD_NOT_FOUND
} WtTableCmdStatus;

typedef struct WtTableCmdDataT {
  Tcl_Obj **tablePtr;
  Tcl_ObjType *type;
} WtTableCmdData;

Tcl_Command WtCreateTableCmd(const char *cmdName,
  Tcl_Obj **tblPtr, Tcl_ObjType *type, Tcl_Interp *interp);

void WtDeleteTableCmdProc(ClientData clientData);

int WtNamedTableCmd(ClientData clientData, Tcl_Interp *interp,
  int objc, Tcl_Obj *const objv[]);

Tcl_Obj *WtTableCmdGetTable(Tcl_Interp *interp, Tcl_Obj *obj, int *created, Tcl_ObjType *type);

WtTableCmdStatus WtTableCmdHelper(ClientData clientData, Tcl_Interp *interp,
  int objc, Tcl_Obj *const objv[], int *tclResult,
  Tcl_ObjType *type, int readOnly, int appendUsage);

void WtTableCmdUsageError(Tcl_Interp *interp, Tcl_Obj *cmd, int readOnly);

void WtTableCmdAppendUsage(Tcl_Interp *interp, Tcl_Obj *cmd, int readOnly);

int WtTableCmd(ClientData clientData, Tcl_Interp *interp,
  int objc, Tcl_Obj *const objv[]);

int WtCaselessTableCmd(ClientData clientData, Tcl_Interp *interp,
  int objc, Tcl_Obj *const objv[]);

int WtTblCmdGetVar(Tcl_Obj *var, Tcl_Obj **val,
  Tcl_ObjType *type, Tcl_Interp *interp);

int WtTblCmdOwnVar(Tcl_Obj *var, Tcl_Obj **val, Tcl_ObjType *type,
  int *created, Tcl_Interp *interp);

Tcl_Obj *WtTblCmdSetVar(Tcl_Obj *var, Tcl_Obj *val,
  Tcl_Interp *interp);

Tcl_Obj *WtTblCmdGetVal(Tcl_Obj *val, Tcl_ObjType *type,
  Tcl_Interp *interp);

WtTableCmdStatus WtTableMethodHelper(ClientData clientData,
  Tcl_Interp *interp, int objc, Tcl_Obj *const objv[], int *tclResult,
  Tcl_Obj **tablePtr, Tcl_ObjType *type, int readOnly, int appendUsage);

void WtTableMethodUsageError(Tcl_Interp *interp, Tcl_Obj *cmd,
  int readOnly);

void WtTableMethodAppendUsage(Tcl_Interp *interp, Tcl_Obj *cmd,
  int readOnly);

void WtInitTableCommands(Tcl_Interp *interp);

#endif /* !_WT_TABLE_CMDS_H */
